package m.jclecai.com.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by hp on 2017/4/17.
 */

public class TraceUtil {
    /**
     * * @param startMoney 起始金额
     * * @param startBei  起始倍数
     * * @param len   追号期数
     * * @param leftLen   前  X 期
     * * @param leftPayoff 前  X 期盈利、 前  X 期盈利率
     * * @param payoff  后  X 期盈利、 后   X 期盈利率 | 全程最低盈利 、全程最低盈利率
     * * @param win  中奖金额
     * * @param sum  投注金额
     * * @param lv  是否利润率
     *
     * @return list 倍数
     * @since fleaphp.net 2017-4-10 下午8:25:33
     */
    public static List<String> beishuMake(double startMoney, double startBei, double len, double leftLen, double leftPayoff, double payoff, double win, double sum, boolean lv) {
        List<String> result = new ArrayList<String>();

        double beiTotal = startBei;
        double bei = startBei;
        double i = 0;
        if (!lv) { //如果是累计利润

            while (result.size() < len) {

                double _payoff = (result.size() < leftLen) ? leftPayoff : payoff;
                if (bei * win >= ((beiTotal * sum) + _payoff + startMoney * (i + 1))) {
                    result.add(bei + "");
                    bei = startBei;
                    beiTotal += startBei;
                } else {
                    bei += 1;
                    beiTotal += 1;
                    i += 1;
                }
                if (bei > 99999) return result;
            }
        } else { //如果是利润率
            while (result.size() < len) {
                double _payoff = (result.size() < leftLen) ? leftPayoff : payoff;
                _payoff = _payoff / 100;
                //System.out.println(_payoff);
                double x = (bei * win - startMoney - beiTotal * sum) / ((beiTotal * sum) + startMoney);
                //System.out.println(x);
                if (x >= _payoff) {
                    //System.out.println(bei);
                    result.add(bei + "");
                    bei = startBei;
                    beiTotal += startBei;
                    i += 1;
                } else {
                    bei += 1;
                    beiTotal += 1;
                }
                if (bei > 99999) return result;
            }
        }
        return result;
    }



    /**
     *  获得所有选号中，金额最小的选号 (任选六\  任选七  \ 任选八 )
     第一注          02 03 04 05 06 07 08 09
     任选七   8注16元
     第二注  	04 06 07 08 09 10 11
     任选七   1注2元
     计算时以第二注 为准，他的奖金为26.00 但有可能中了多个26.00

     @param count 投注的号码的长度
     @param min 投注的号码的最小长度  任选六\6  任选七  \7 任选八 \8
     *
     */
    public static double getWinBonus(String key, String methodId, int count, int min) {
        double b = BonusUtil.getlotBonus(key, methodId);
        if (BonusUtil.isSYXW(key) && (methodId.equals("6") || methodId.equals("7") || methodId.equals("8"))) {
            //count >=6   任选六\  任选七  \ 任选八
            int m = count - 5; //开奖号码个数
            int n = count - min;//min>=6
            int x = combination(m, n);
            b *= x;
        }
        return b;
    }

    /**
     * <p>
     * 计算 C(m,n)个数 = (m!)/(n!*(m-n)!)
     * </p>
     * 从M个数中选N个数，函数返回有多少种选法 参数 m 必须大于等于 n m = 0; n = 0; retuan 1;
     *
     * @param m
     * @param n
     * @return
     * @since fleaphp.net 2014-6-13 下午8:25:33
     */
    public static int combination(int m, int n) {
        if (m < n)
            return 0; // 如果总数小于取出的数，直接返回0

        int k = 1;
        int j = 1;
        // 该种算法约掉了分母的(m-n)!,这样分子相乘的个数就是有n个了
        for (int i = n; i >= 1; i--) {
            k = k * m;
            j = j * n;
            m--;
            n--;
        }
        return k / j;
    }

    public static double ListDoubleArrayMax(List<Double> dataList) {
        double max = Double.MIN_VALUE;

        for (double d : dataList) {
            if (d > max) {
                max = d;
            }
        }
        return max;
    }


    public static double ListDoubleArrayMin(List<Double> dataList) {
        double min = Double.MAX_VALUE;

        for (double d : dataList) {
            if (d < min) {
                min = d;
            }
        }
        return min;
    }

}
